我们可以在application.properties
/application.yml
文件中或通过命令行指定各种的属性。可以配置的属性见官方参考文档:Common application porperties。
1 自动配置原理
1.1 @EnableAutoConfiguration
Spring Boot 启动的时候,加载主配置类,使用@EnableAutoConfiguration
(@SpringBootApplication
组合注解里的一个),开启了自动配置功能。
@EnableAutoConfiguration
注解作用是利用EnableAutoConfigurationImportSelector
选择器给容器中导入一些组件。该选择器扫描所有jar包类路径下的META-INF/spring.factories
文件。获取文件中key为EnableAutoConfiguration
类名对应的值,然后将他们添加到容器中:
1 | # Auto Configure |
每一个这样的XxxAutoConfiguration
类都是容器中的一个组件,作用就是用来进行自动配置。
1.2 以 HttpEncodingAutoConfiguration 为例
1 | // 这是一个配置类 |
根据当前不同的条件判断,决定这个配置类是否生效。一旦这个配置类生效,这个配置类就会给容器中添加各种组件,这个组件的属性是从对应的properties类中获取的,这些properties类里面的每一个属性又是和配置文件绑定的。
@HttpEncodingProperties
:所有可以在配置文件中配置的属性都是在XxxProperties
类中封装。因此,配置文件中可以配置的数据就可以参照每一个自动配置的属性类。
1 | // 从配置文件中获取指定的值,并和bean进行绑定 |
1.3 总结
XxxAutoConfiguration
:自动配置类,配置类一旦生效,就会给容器中添加组件。
XxxProperties
:封装配置文件中相关的属性。
一、Spring Boot 启动时会加载大量的自动配置类。
二、自动配置类生效时已经自动配置了一些组件,已经配置的组件,就不需要我们自己配置了。
三、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性值,我们就可以在配置文件中指定这些属性值。
2 @Conditional 派生注解
Spring 框架有@Conditional
条件注解,只有当条件注解中的条件生效,对应的配置类配置的内容才会生效。
Spring Boot 对条件注解进行了扩展:
@Conditional扩展注解 | 作用(判断是否满足当前指定条件) |
---|---|
@ConditionalOnJava |
系统的java版本是否符合要求 |
@ConditionalOnBean |
容器中存在指定Bean; |
@ConditionalOnMissingBean |
容器中不存在指定Bean; |
@ConditionalOnExpression |
满足SpEL表达式指定 |
@ConditionalOnClass |
系统中有指定的类 |
@ConditionalOnMissingClass |
系统中没有指定的类 |
@ConditionalOnSingleCandidate |
容器中只有一个指定的Bean,或者这个Bean是首选Bean |
@ConditionalOnProperty |
系统中指定的属性是否有指定的值 |
@ConditionalOnResource |
类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication |
当前是web环境 |
@ConditionalOnNotWebApplication |
当前不是web环境 |
@ConditionalOnJndi |
JNDI存在指定项 |
3 自动配置报告
自动配置类只有在一定的条件下才能生效。我们怎么才能知道哪些自动配置类生效了,哪些没有生效呢?
此时我们可以开启Spring Boot 的 debug模式。
在application.properties
/application.yml
配置文件中配置:debug=true
。这样可以在控制台打印自动配置报告。